package com.lc.midi.mid;

import java.io.IOException;
import java.util.List;

public class MidiHead {
	private final static String MThd = "MThd";
	private int len;
	MidiType mtrkType;
	short mtrkNum;
	short ticks;
	
	public MidiType getMtrkType() {
		return mtrkType;
	}
	public short getMtrkNum() {
		return mtrkNum;
	}
	public short getTicks() {
		return ticks;
	}
	
	public void write(List<Byte> bytes) {
		bytes.add((byte)'M');
		bytes.add((byte)'T');
		bytes.add((byte)'h');
		bytes.add((byte)'d');
		
	}

	public int read(MidiFile midifile) throws IOException, MidiException{
		byte [] tmp = new byte[4];
		int ret = midifile.read(tmp);
		if (!ByteConvert.btoStr(tmp).equals(MThd)) {
			throw new MidiException("head is not MThd");
		}
		ret = midifile.read(tmp);
		len = ByteConvert.btoInt(tmp);
		if (len != 6) {
			throw new MidiException("head len != 6");
		}
		tmp = new byte[2];
		ret = midifile.read(tmp);
		mtrkType = MidiType.values()[ByteConvert.btoShort(tmp)];
		ret = midifile.read(tmp);
		mtrkNum = ByteConvert.btoShort(tmp);
		ret = midifile.read(tmp);
		short division = ByteConvert.btoShort(tmp);
		//division指定计数的方法，一种随时间计数（最高位设置为０时），另一种使用制式的时间码（最高位设置为１时）
		if ((division & 0x8000) == 0x8000) {
			//division最高位为1 暂时不知道如何处理
			/*
			 * 转自：https://wenku.baidu.com/view/fe168f4be518964bcf847cfe.html
			 * SMPTE本来是用于视频中的协议，所以它的计量单位为“帧”，就是“frame”。
			 * 视频中有“帧率”的概念，单位为“帧/秒（fps）”。
			 * 不同的视频标 准中有不同的帧率，比如25fps、30fps等等。
			 * 如果MIDI系统中使用这种时间度量法，那么它所定义的就是，在每一帧中，所具有的Midi Tick数目。
			 * 这种度量法在单纯的MIDI系统中比较少见，笔者概念也显模糊，故不细谈。
			 */
			throw new MidiException("division max bit is 1");
		}else {
			ticks = division;
		}
		return 4 + 4 + 2 + 2 + 2;
	}
}
